package com.yixiu.demo.bio.simpleproxy;

import com.yixiu.demo.bio.simpleproxy.server.HelloService;
import com.yixiu.demo.bio.simpleproxy.server.IHello;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by jinhe on 2019/3/20.
 * 服务端存根：记录了服务端有哪些服务
 */
public class RpcProxyServer {
    private IHello hello = new HelloService();

    /**
     * 发布服务
     * @param port 端口号
     */
    public void publisherServer(int port) {
        try (ServerSocket ss = new ServerSocket(port)) {  // 打开一个serversocket
            while (true) {
                try (Socket socket = ss.accept()) {  // 阻塞方式：接收客户端的请求
                    try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {  // 从socket获取对象输入流
                        String method = ois.readUTF(); // 使用utf8读取一串字符串，这一串是客户端写的 方法名
                        Object[] objs = (Object[]) ois.readObject();  // 读取参数
                        Class<?>[] types = new Class[objs.length];
                        for (int i = 0; i < types.length; i++) {
                            types[i] = objs[i].getClass(); // 根据参数值获取参数类型
                        }
                        Method m = HelloService.class.getMethod(method, types); // 根据方法名和参数类型，获取方法
                        Object obj = m.invoke(hello, objs); // 反射调用方法

                        try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
                            oos.writeObject(obj); // 将结果写回去
                            oos.flush();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

